<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="../css/style.css" type="text/css" media="screen">
</head>
<body>
    <div class="entry"> 
 <div id="toc">
  <strong>目录</strong>
  <span>[hide]</span> 
  <ul id="toc_l"> 
   <li><a href="#Function_call">函数调用 </a></li> 
   <li><a href="#Special_functions">特殊函数 </a></li> 
  </ul> 
 </div> 
 <p>函数是一段已命名的程序，它可以从程序任一部分多次调用。它是由函数返回值的类型说明、函数名称、形式参数和语句块组成。传递参数的个数被限定在64个之内。</p> 
 <p>示例:</p> 
 <pre class="brush: mql4; toolbar: false;">double                       // 返回值的类型
linfunc (double x, double a, double b) // 函数名称和参量列表
{
                             // 语句块
   return (a + b);           // 返回表达式值
}</pre> 
 <p>return语句可以返回函数内表达式的值。如有必要，表达式值的类型可以转换为函数结果类型。没有返回值的函数必须定义成 “void” 型。</p> 
 <p>示例:</p> 
 <pre class="brush: mql4; toolbar: false;">void errmesg(string s)
  {
   Print("错误: "+s);
  }</pre> 
 <p>函数的参数可能存在默认值，这些默认值是用相应类型常量定义的。</p> 
 <p>示例:</p> 
 <pre class="brush: mql4; toolbar: false;">int somefunc(double a, double d=0.0001, int n=5, bool b=true, string s="passed string")
  {
   Print("需求参量 a=",a);
   Print("下列参量被传送: d=",d," n=",n," b=",b," s=",s);
   return (0);
  }</pre> 
 <p>如果为某个参数指定了默认值，那么所有后续的参数也必须指定默认值。</p> 
 <p>错误范例:</p> 
 <pre class="brush: mql4; toolbar: false;">int somefunc(double a, double d=0.0001, int n, bool b, string s="passed string")
  {
  }</pre> 
 <div class="divider top-of-page">
  <a title="Top of Page" href="#top">Back to Top</a>
 </div> 
 <h2><a name="Function_call"></a>函数调用</h2> 
 <p>如果在表达式前出现一个曾未用过的名字，又后跟一个左括号，在上下文环境中它将被视作函数的名字。</p> 
 <pre><em>函数名称 (x1, x2,..., xn)</em></pre> 
 <p>函数自变量(<a href="372.html#Formal_parameters">形式参数</a>)按值的方式传递，也就是说，先计算每一个表达式xl,…，xn的值，再将其值传递给函数，表达式计算顺序及其值的传递要确保无误。在执行期间，系统将检查那些提供给函数的值和参数的类型。这种形式的函数调用被称为“值传递”。调用函数是为了获得函数返回的表达式值。函数的定义类型必须符合函数返回值的类型。在全局层次，我们可以在程序的任何位置定义和说明函数，即要在其他函数之外定义，在函数之内，不能定义或说明另一个函数。</p> 
 <p>例如:</p> 
 <pre class="brush: mql4; toolbar: false;">int start()
  {
   double some_array[4]={0.3, 1.4, 2.5, 3.6};
   double a=linfunc(some_array, 10.5, 8);
   //...
  }
double linfunc(double x[], double a, double b)
  {
   return (a*x[0] + b);
  }</pre> 
 <p>当我们使用默认参数调用函数时，参数列表使用规则是有要求的。参数列表中无默认值的参数必须指定值，且不可以省略。有默认值的参数要么全省略掉，要么指定值，不可只省略其中部分参数。</p> 
 <p>例如:</p> 
 <pre class="brush: mql4; toolbar: false;">void somefunc(double init,double sec=0.0001,int level=10);  // 函数原型

somefunc();                   // 错误调用, 第一请求参量必须存在。
somefunc(3.14);               // 正确调用
somefunc(3.14, 0.0002);       // 正确调用
somefunc(3.14, 0.0002, 10);   // 正确调用</pre> 
 <p>当我们调用一个函数时，不可以忽略参数，即使那些存在默认值的参数也不行。</p> 
 <pre class="brush: mql4; toolbar: false;">somefunc(3.14, , 10);         // 错误调用。第二参量被忽略。</pre> 
 <div class="divider top-of-page">
  <a title="Top of Page" href="#top">Back to Top</a>
 </div> 
 <h2><a name="Special_functions"></a>特殊函数</h2> 
 <p>在MQL4中存在三种预定义名称函数:</p> 
 <p><strong>init() </strong>是一个在模块初始化时调用的函数，可以用此函数在开始自定义指标或者自动交易之前做初始化操作。如果这个函数不可用，初始化时就不会调用任何函数。</p> 
 <p><strong>start() </strong>是主函数。对于智能交易，它在收到下一跳数据后调用该函数。对于自定义指标，在指标添加到图表之后，或在客户端开始运行之时，也可在收到下一跳数据之后，该函数被调用。对于脚本，在脚本被添加到图表之后立即执行并初始化。如果模块中根本不存在start()函数，模块(智能交易、脚本或自定义指标)就不能执行。</p> 
 <p><strong>deinit() </strong>是一个模块的析构函数(注：借用C++概念)，执行一与init()函数相反的操作。deinit()函数往往用来做“清理善后”的工作，例如，创建对象时开辟了一片内存空问，退出模块前需要释放。如果用户没有编写该函数，它也不会执行任何操作。</p> 
 <p>预定义函数可以带参数。不过，当客户端调用这些函数时，并不能从外部向它传递参数，只能采用默认值。start(),&nbsp; init()和deinit()函数可从模块任何一点按照常规函数规则调用，等同于其他函数。</p> 
 <p>不推荐从init()函数调用start ()函数或是执行交易操作。对于图表数据、市价等，在模块初始化期间，数据可能残缺不全，这时，init()和deinit()函数必须尽快地完成任务。在调用start()函数之前，千万不要开始尝试交易操作。</p> 
 <div class="divider top-of-page">
  <a title="Top of Page" href="#top">Back to Top</a>
 </div> 本文地址：
 <a href="371.html" rel="bookmark"><b>371.html</b></a> 
</div>
</body>
</html>